compute sediment routing in channelized drainage network using Muskingum-Cunge method. Interrill erosion is supposed to act as suspended sediment so deposition is not contemplated. Bedload sediment is divided in different grainsize classes and routing is performed for each class separately. Deposition is contemplated comparing sediment discharge to transport capacity. Flow Routing method code remind: 0 --> hillslope, water flow rate is not defined 1,2,3,11,30 --> channel routing, water flow is computed according to different schemes 5 --> Instantaneous mass transferring inside lakes (infinitive celerity) 1000:2000 --> reservoir
References:
Sun, H., P. S. Cornish, and T. M. Daniell, Contour-based digital elevation modeling of watershed erosion and sedimentation: Erosion and sedimentation estimation tool (EROSET), Water Resour. Res., 38(11), 1233, doi:10.1029/2001WR000960, 2002.
Singh, V.P., Quiroga, C.A., A dam-breach erosion model: I. formulation, Water resources management, 1, 177-197, 1987.
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer(kind=short) | :: | dt |
routing time step |
|||
type(grid_real), | intent(in) | :: | flow | |||
type(grid_real), | intent(in) | :: | v |
water flow velocity in channel (m/s) |
||
type(grid_real), | intent(in) | :: | dp |
water depth (m) |
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
real(kind=float), | public | :: | cappa | ||||
real(kind=float), | public | :: | ddx | ||||
integer(kind=short), | public | :: | iin | ||||
integer(kind=short), | public | :: | is | ||||
integer(kind=short), | public | :: | jin | ||||
integer(kind=short), | public | :: | js | ||||
integer(kind=short), | public | :: | k | ||||
real(kind=float), | public | :: | transportCapacity | ||||
real(kind=float), | public | :: | vel | ||||
real(kind=float), | public | :: | wd | ||||
real(kind=float), | public | :: | width |
SUBROUTINE SedimentRouting & ! (dt, flow, v, dp) !Arguments with intent in: INTEGER (KIND = short) :: dt !!routing time step TYPE (grid_real), INTENT(IN) :: flow TYPE (grid_real), INTENT(IN) :: v !!water flow velocity in channel (m/s) TYPE (grid_real), INTENT(IN) :: dp !!water depth (m) !local declarations: INTEGER (KIND = short) :: k, iin, jin, is, js REAL (KIND = float) :: ddx, cappa REAL (KIND = float) :: vel REAL (KIND = float) :: transportCapacity REAL (KIND = float) :: wd REAL (KIND = float) :: width !------------end of declaration------------------------------------------------ QinSS = 0. DO K=1,sedReach%nreach iin=sedReach%branch(k)%i0 jin=sedReach%branch(k)%j0 DO WHILE ( .NOT.((jin == sedReach%branch(k)%j1) .AND. & (iin == sedReach%branch(k)%i1)) ) CALL DownstreamCell (iin, jin, sedFlowDirection % mat(iin,jin), & is, js, ddx, sedFlowDirection) SELECT CASE (sedReach % branch (k) % routingMethod) CASE (0) !compute cumulated sediment rate on hillslope along drainage network !first cell of order 1 reach IF (sedReach % branch (k) % order == 1 .AND. & sedReach % branch (k) % I0 == iin .AND. & sedReach % branch (k) % J0 == jin) THEN QinSS % mat(iin,jin) = interrillErosion % mat(iin,jin) QinSS % mat(is,js) = QinSS % mat(iin,jin) + interrillErosion % mat(is,js) ELSE QinSS % mat(is,js) = QinSS % mat(is,js) + QinSS % mat(iin,jin) + interrillErosion % mat(is,js) END IF !QinSS % mat(is,js) = QinSS % mat(is,js) + QinSS % mat(iin,jin) !update storage sediment variation. On hillslope variation is always negative deltaSed % mat(iin,jin) = deltaSed % mat(iin,jin) - & interrillErosion % mat(iin,jin) * dt / 1000000. CASE (1,2,3,11,30) ! sediment routing in channel reach !suspended solid !^^^^^^^^^^^^^^^ ! QoutSS % mat(iin,jin) = QinSS % mat(iin,jin) * gridC1 % mat(iin,jin) + & ! PinSS % mat(iin,jin) * gridC2 % mat(iin,jin) + & ! PoutSS % mat(iin,jin) * gridC3 % mat(iin,jin) !DA SISTEMARE - GR 12/10/2016 !vel = flow % mat (iin,jin) / (dp % mat (iin,jin) * dp % mat (iin,jin) * sedReach % branch (k) % B0) IF (vel > 0.) THEN cappa = ddx / vel !cappa = 3 CALL MuskingumCungeTodini ( dt = dt, dx = ddx, & Qin = QinSS%mat(iin,jin), & Pin = PinSS%mat(iin,jin), & Pout = PoutSS%mat(iin,jin), & Qlat = 0., Plat = 0., & B0 = 0., alpha = 0., slope = 0., n = 0., & Qout = QoutSS%mat(iin,jin), & depth = wd, width = width, k = cappa, x = 0. ) ELSE QoutSS % mat(iin,jin) = 0. END IF !filter negative discharge IF ( QoutSS % mat(iin,jin) < 0.) THEN QoutSS % mat(iin,jin) = 0. END IF !limit suspended load to transport capacity !assume particle size coming from hillslope of 0.02 mm transportCapacity = Yang1979 (flow % mat(iin,jin), & sedReach % branch(k) % slope, & vel, 0.02, & dp % mat(iin,jin) ) IF ( QoutSS % mat(iin,jin) > transportCapacity ) THEN ! deltaSed % mat(iin,jin) = deltaSed % mat(iin,jin) + & ! (QoutSS % mat(iin,jin) - transportCapacity) * dt / 1000000. QoutSS % mat(iin,jin) = transportCapacity QinSS % mat(iin,jin) = transportCapacity END IF !update storage sediment variation deltaSed % mat(iin,jin) = deltaSed % mat(iin,jin) + & (QinSS % mat(iin,jin) - QoutSS % mat(iin,jin)) * dt / 1000000. !update downstream input discharge QinSS % mat(is,js) = QinSS % mat(is,js) + QoutSS % mat(iin,jin) !store computed discharge for next time step PinSS % mat(iin,jin) = QinSS % mat(iin,jin) PoutSS % mat(iin,jin) = QoutSS % mat(iin,jin) !bed load transport !^^^^^^^^^^^^^^^^^^ !compute source term QinBL % mat(iin,jin) = QinBL % mat(iin,jin) + ChannelDetachmentRate (flow % mat(iin,jin), & sedReach%branch(k)%slope, & rusleK % mat (iin,jin), & rusleC % mat (iin,jin) ) !update storage sediment variation ! deltaSed % mat(iin,jin) = deltaSed % mat(iin,jin) - & ! QinBL % mat(iin,jin) * dt / 1000000. !route downstream ! QoutBL % mat(iin,jin) = QinBL % mat(iin,jin) * gridC1 % mat(iin,jin) + & ! PinBL % mat(iin,jin) * gridC2 % mat(iin,jin) + & ! PoutBL % mat(iin,jin) * gridC3 % mat(iin,jin) IF (vel > 0.) THEN cappa = ddx / vel CALL MuskingumCungeTodini ( dt = dt, dx = ddx, & Qin = QinBL%mat(iin,jin), & Pin = PinBL%mat(iin,jin), & Pout = PoutBL%mat(iin,jin), & Qlat = 0., Plat = 0., & B0 = 0., alpha = 0., slope = 0., n = 0., & Qout = QoutBL%mat(iin,jin), & depth = wd, width = width, k = cappa, x = 0. ) ELSE QoutBL % mat(iin,jin) = 0. END IF !filter negative discharge IF ( QoutBL % mat(iin,jin) < 0.) THEN QoutBL % mat(iin,jin) = 0. END IF !limit bed load to transport capacity transportCapacity = Yang1973 (flow % mat(iin,jin), & sedReach%branch(k)%slope, & vel, sedReach%branch(k)%d50, & dp % mat(iin,jin) ) IF ( QoutBL % mat(iin,jin) > transportCapacity ) THEN !update storage sediment variation if deposition is positive ! deltaSed % mat(iin,jin) = deltaSed % mat(iin,jin) + & ! (QoutBL % mat(iin,jin) - transportCapacity) * dt / 1000000. QoutBL % mat(iin,jin) = transportCapacity QinBL % mat(iin,jin) = transportCapacity END IF !update storage sediment variation deltaSed % mat(iin,jin) = deltaSed % mat(iin,jin) + & (QinBL % mat(iin,jin) - QoutBL % mat(iin,jin)) * dt / 1000000. !update downstream input discharge QinBL % mat(is,js) = QinBL % mat(is,js) + QoutBL % mat(iin,jin) !store computed discharge for next time step PinBL % mat(iin,jin) = QinBL % mat(iin,jin) PoutBL % mat(iin,jin) = QoutBL % mat(iin,jin) !build QoutSed !^^^^^^^^^^^^^ QoutSed % mat(iin,jin) = QoutSS % mat(iin,jin) + QoutBL % mat(iin,jin) !QoutSed % mat(iin,jin) = QoutBL % mat(iin,jin) END SELECT !go downstream jin = js iin = is END DO !last cell of last reach IF (K == sedReach%nreach) THEN END IF END DO END SUBROUTINE SedimentRouting